package model;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class Tile {
	
	private Tile tileArriba;
	private Tile tileAbajo;
	private Tile tileDerecho;
	private Tile tileIzquierdo;
	private List <Edible> comibles; 
	private int fila;
	private int columna;
	private int id;

	
	public Tile(int fila, int columna, int id) {
		this.fila = fila;
		this.columna = columna;
		this.id = id;
		comibles = new ArrayList<Edible>();
	}
	
	public int getFila() {
		return this.fila;
	}

	public int getColumna() {
		return this.columna;
	}

	public Tile getEslabonAbajo() {
		return tileAbajo;
	}
	
	public void setEslabonAbajo(Tile tileAbajo) {
		this.tileAbajo = tileAbajo;
	}
	
	public Tile getEslabonDerecho() {
		return tileDerecho;
	}
	
	public void setEslabonDerecho(Tile tileDerecho) {
		this.tileDerecho = tileDerecho;
	}
	
	public Tile getEslabonIzquierdo() {
		return tileIzquierdo;
	}
	
	public void setEslabonIzquierdo(Tile tileIzquierdo) {
		this.tileIzquierdo = tileIzquierdo;
	}

	
	public Tile getEslabonArriba() {
		return tileArriba;
	}

	public void setEslabonArriba(Tile tileArriba) {
		this.tileArriba = tileArriba;
	}
	public void addComible (Edible comible){
		comibles.add(comible);
	}
	public List<Edible> getComibles(){
		return comibles;
	}

	public void remove(Edible comible) {
		Iterator<Edible> iterator = comibles.iterator();
		while (iterator.hasNext()){
			if (iterator.next() == comible){
				iterator.remove();
			}
		}
		
		//comibles.remove(comible);*/		
	}
	
	public Tile getEslabonEnDireccion(Direccion direccion){
		Tile tileEnDireccion = null;
		switch (direccion) {
		case ARRIBA:
			tileEnDireccion  = tileArriba;
			break;
		case ABAJO:
			tileEnDireccion  = tileAbajo;
			break;
		case IZQUIERDA:
			tileEnDireccion  = tileIzquierdo;
			break;
		case DERECHA:
			tileEnDireccion  = tileDerecho;
			break;
			}
		return tileEnDireccion;
		
	}

	public void comiblesComidosPor(Pacman pacman) {
		List<Edible> comiblesAComer =  new ArrayList<Edible>(this.getComibles());
		Iterator<Edible> iterator = comiblesAComer.iterator();
		while (iterator.hasNext()){
			iterator.next().esComidoPor(pacman);
		}
	}

	public int getId() {
		
		return id;
	}

	public Element writeToXmlFormat(Document listEslabones) {
		Element elemFantasma = listEslabones.createElement("nodo");
		elemFantasma.setAttribute("id", String.valueOf(id));
		elemFantasma.setAttribute("fila", String.valueOf(fila));
		elemFantasma.setAttribute("columna", String.valueOf(columna));
		elemFantasma.setAttribute("contiene", getAlimentoContenido());
		elemFantasma.setAttribute("izquierda", parsearLinkEslabon(this.getEslabonIzquierdo()));
		elemFantasma.setAttribute("derecha", parsearLinkEslabon(this.getEslabonDerecho()));
		elemFantasma.setAttribute("arriba", parsearLinkEslabon(this.getEslabonArriba()));
		elemFantasma.setAttribute("abajo", parsearLinkEslabon(this.getEslabonAbajo()));
		return elemFantasma;
	}

	private String getAlimentoContenido() {
		String contenido =""; 
		for (Edible comible : comibles) {
			if (comible instanceof Pellet){
				contenido = "bolita";
			}
			if (comible instanceof PowerUp){
				contenido = "bolon";
			}
		}
		
		return contenido;
	}
	private String parsearLinkEslabon(Tile tile){
		String retorno = "";
		if (tile != null){
			retorno = String.valueOf(tile.getId());
		}
		return retorno;
	}
}
